package com.lanou3g.code0417.tickets;

/**
 * Created by dllo on 18/4/17.
 */
// 票务中心
public class TicketOffice {
    private int tickets = 100;// 有100张票
    private final Object lock = new Object();

    //返回值代表 是否还有票
    public boolean sellTicket() {
        /*
        /为了解决线程 安全问题Java 引入到了同步机制:synchordnized
               语法
               synchroinzed(lock)
               //只能一时 由一个线程访问
               }
                 大括号内的代码,在同一时间,只能被一个线程调用
                 及时线程在大括号内停止,其他线程 也无法金额到大括号内

                 小括号内 我们称之为锁 对象, 可以 是任意改变的对象
                 但是要注意 ,成为锁的对象的 对象,不能再改变了,
                 一般的,我们 都会为锁 对象 加上final 防止它 被改变
                 */
        synchronized (lock) {


            if (tickets <= 0) {
                return false;
            }
            try {
                //让当前线程停止100毫秒
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
            tickets--;
            System.out.println(Thread.currentThread().getName() + "卖出一张票,还剩:" + tickets + "张");
            return true;
        }
    }
    // 在方法的返回值前   可以加上 synchronized关键字
    // 相当于把整个方法都放到同步代码块中
    //  不需要锁 对象.这时锁对象时 类名.class(这个类的对象 类对象JVM加载这个类时,自动创建的)
}
